![]() | PROGRAMACIÓN IMPERATIVA |
Condición arriba | Condición abajo |
WHILE condición
a END WHILE | REPEAT
a UNTIL condición |
(a1 ← c →' a2)
o bien
(a2 ←' c → a1)
c
se cumple, se evalúa a1
. Si no se cumple, se evalúa a2
.
Si no existe bloque ELSE, basta con especificar (a1 ← c)
o bien (c → a1)
. Si se cumple c
, se evalúa a1
. Análogamente, si sólo existe bloque ELSE (condición contraria), se especifica (a2 ←' c)
o bien (c →' a2)
.
(a ← x>3 →' b) // si x>3, tenemos a. En caso contrario, tenemos b
(a ← x>3) // si x>3, tenemos a.
(a ← (x>3 ∧ x<10) →' b) // Si x>3 y x<10, tenemos a. En caso contrario, tenemos b
(a ← (x>3 ∨ y>5) →' b) // Si x>3 ó y>5, tenemos a. En caso contrario, tenemos b
(a ← (x=1 ∨ x=2 ∨ x=3) →' b) // Si x es 1, 2 ó 3, tenemos a. En caso contrario, tenemos b
((c1 → a1) (c2 → a2) ... (cn → an))
ci
que se cumplan.
(a1 ← c1 →' (a2 ← c2 →' a3))
(a1 ← c1 →' (a2 ← c2 →' (a3 ← c3 →' a4)))
c1
; si no se cumple, se evalúa c2
, etc. Al final sólo se evaluaría una de las ai
.
(a1 ← c1 →'
(a2 ← c2 →'
(a3 ← c3 →' a4)
)
)
(a1 ← c1 →' (a2 ← c2 →' (a3 ← c3 →' a4))))
(z1 (z2 (z3 a4)))
〈( zi = (ai ← ci →')↓ )〉
(z1 (z2 (z3 a4)))/〈( zi = (ai ← ci →')↓ )〉
n
condiciones,
(〈( (z1…zn a(n+1)))/á( zi = (ai ← ci →')↓ )〉
x
:
(((x = 1) a) ((x = 3) a) ((x = 5) a))
([((x = [1 3 5]) a)])
(v = (1 3 5)↓)
, es decir, la secuencia abierta de valores que recorre la variable x
, tenemos finalmente la expresión general:
([((x = [v]) a)])
〈( bucle(x v a) = ([((x = [v]) a)]) )〉
x
: Nombre de la variable de control.
v
: Secuencia (expresión abierta) de los valores que recorre la variable x
.
a
: Cuerpo del bucle.
bucle(v (v1 v1+v3 … v2) a)
Niveles | Bucle |
1 | FOR x1 = v1
a1 END FOR |
2 | FOR x2 = v2
a2 FOR x1 = v1 a1 END FOR END FOR |
3 | FOR x3 = v3
a3 FOR x2 = v2 a2 FOR x1 = v1 a1 END FOR END FOR END FOR |
bucle(x1 v1 a1)
bucle(x2 v2 (a2 bucle(x1 v1 a1) b2))
bucle(x3 v3 (a3 bucle(x2 v2 (a2 bucle(x1 v1 a1) b2)) b3))
n
niveles, tenemos un hiperbucle, es decir, una estructura de bucles anidados con el número de niveles variable:
〈( hiperbucle(x v a n) = bucle(x1 v1 a1) ← n=1 →'
(a(n) hiperbucle(x(n−1) v(n−1) a(n−1)) b(n))) )〉
( (x1 = u) (x2 = v) (x3 = w) )
( x = (x1 x2 x3) )
( (v1 = 1…10) (v2 = (1 2 3)↓) (v3 = (1 3 … 10) )
( v = (v1 v2 v3) )
(a1 = (. . .) // cuerpo bucle 1
(a2 = (. . .) // cuerpo bucle 2
(a3 = (. . .) // cuerpo bucle 3
hiperbucle(x v a 3)
n
de veces (fijo o variable). Su estructura asociada es:
a★n
n
el número de veces a evaluar el cuerpo a
. En este caso, no se necesita ninguna variable de control del bucle.
(bucle = (c → (a bucle))
〈( (WHILE c a END WHILE) = (bucle = (c → (a bucle)) )〉
( bucle = (a (c → bucle)) )
〈( (REPEAT a UNTIL c) = ( bucle = (a (c → bucle)) ) )〉
Bucle | Código |
WHILE | (b = ((¡ ←' c → a) b)!
|
( (¡ ←' c → a)★ )!
| |
REPEAT | (b = ((a ← c →' ¡)!
|
( a (c →' ¡)★ )!
|
〈( clasif(s) = ((n = s#) // longitud de la secuencia
[(i = [1…(n−1)]) // recorrer los elementos
[(j = [(i+1)…n]) // recorrer siguientes
((s\i) > s\j) → ((u = s\i) //intercambiar
((s\i) = s\j) ((s\j) = u)))
]
]
)
)〉
(s = (36 5 17 12)) // secuencia ejemplo
clasif( s ) // se utiliza el nombre como parámetro
s // ev. (5 12 17 36) (secuencia clasificada)
〈( clasif(s t) = ((n = s#) // longitud de la secuencia
(t = s) // copiar secuencia de entrada
[(i = [1…(n−1)]) // recorrer los elementos
[(j = [(i+1)…n]) // recorrer siguientes
((t\i) > t\j) → ((u = t\i) //intercambiar
((t\i) = t\j)((t/j) = u)))
]
]
)
)〉
(s = (36 5 17 12)) // secuencia ejemplo
clasif(s t)
s // ev. (36 5 17 12)) (secuencia original)
t // ev. (5 12 17 36) (secuencia clasificada)